\section{Approach}

% 3.1
\subsection{Overview}

近期，LLM已经展现出了较强的推理能力和代码生成能力，然而，如何充分利用LLM解决复杂的kbqa问题依然是一个挑战。一个直观的想法使用专业工具，从KB中获取知识作为证据，然后利用大语言模型的推理能力得出问题的答案。本文在现有工作的基础上，对tool进行了升级，使其能够支持更多复杂类型的kbqa任务，例如，类型约束问题，count ask问题等。然后，本文提出了一种交互式的kbqa方法，能够充分利用LLM 上下文学习的能力和推理能力，以few-shot learning的方式，让LLM完成复杂的语义解析过程，并生成答案sparql。最后，基于提出的框架，我们提出了一种人机协同的数据标注方法，标注了复杂问题的推理过程，并在开源模型上进行了微调，进一步提升了模型的性能。


% 3.2
\subsection{tools for KB}

tool的设计原则
kbqa任务本质上是将NL问题转化为kg上的图模式的过程，其实只需要两步：定位element和找到合适的图模式，我们需要尽可能原子级别的工具，以保证其通用性。基于这个原则，本文设计了如下3个tool

SearchNodes(name) Searches for nodes in the knowledge graph based on the surface name {name}. It will return a list of entities with their formal names in KG.
本工具的目的是实体链接，因此，除了返回entity name之外，还会返回能够区分实体的一些特征，例如实体的description，type等。同样。本工具可以基于bm25，或者是向量检索实现，对于不同的db，我们有不同的实现细节，具体见xx。

SearchGraphPatterns(sparql, semantic) 此工具会查询以?e为中心节点的一跳子图（包括in和out边），并且 the `semantic` parameter indicates the expected predicate semantics, the tool will sort the queried subgraphs by semantics，并且最终返回topK个triple。
针对Freebase中的CVT结构，本工具进行了特殊的线性处理，例如，自然语言中的“演员参演电影”，在Freebase中表述为 film.actor.film -> film.performance.film ，然而，这本质上就是一跳关系。因此本工具将星状的cvt结构拆分为了多个一跳关系，并当做一跳关系处理。
例如 我想查询 Tom Hanks 参演的电影？那么对应的使用方法为 SearchGraphPatterns('SELECT ?e WHERE { ?e type.object.name "Tom Hanks"@en . }', semantic="play in film")，本工具会返回 ['?e film.actor.film -> film.performance.film']

本工具关注的是语义上相似的谓词的查询，而不是具体的实体名字，因此，This tool will return a randomly instantiated tail (or head) node for reference. we should pay attention to the semantics of the predicate, not the specific names of the head entity or the tail entity.

更多用法和举例放附录？可以完成 ①给点?e查询谓词 ② sparql=SELECT ?e WHERE { },仅提供seman，表示直接在所有的谓词中查询 ③semantic="" 表示不排序，返回所有的谓词  ④ semantic="play role/play time"表示对多个语义进行排序


ExecuteSPARQL(sparql) Execute a SPARQL query. 


% 3.3
\subsection{对话式kbqa}


基于上述api，我们设计了一个通用的 planing-action-Thought KBQA 方法，该过程是以对话的形式多次和Kb交互，利用Openai的大模型对KB执行读取和推理。
给定复杂问题，我们根据问题语义，将其拆分为多个子问题，然后对于每一轮对话，我们要求模型基于当前和历史的obersevation，生成思考过程和action，用于寻找必要的信息，最后生成sparql。

planing 给定复杂问题，首先我们尝试将其分解为三元组形式的子问题，例如，对于问题 What zoo that opened earliest is there to see in Dallas, TX ?，我们可以将其分解为(target zoo, locate in, "Dallas, TX"), (target zoo, opened, earliest). 这是一个free form的标注，仅根据问题语义进行拆分，目的是用于帮助LLM和人类理解问题的语义。

action 在每一轮对话中，我们都要求LLM生成一个action，否则返回错误。有效的action集合为 {SearchNodes, SearchGraphPatterns, ExecuteSPARQL, Done} 

Thought 执行action后，tool会返回执行结果，LLM需要根据当前的observation，生成一个thought，显式的表达其思考过程。例如，对于SearchGraphPatterns的返回结果，模型需要解释 "xx is the predicate I want" or "there is no predicate I want"，同样，这么做是为了make the decisions explainable。
在每一轮中，LLM被要求先生成thought，然后以action结束


回答流程 如上所述，KBQA的本质是locate element和找到合适的图模式。因此，我们需要先在kg中找到和问题对应的点和边
一般情况下，after planning之后的第一个动作，是定位topic entity，本文没有使用sota的EL方法，而是采用通用的方法，让LLM根据返回结果确定entity。
然后，找到topic entity之后，我们需要使用SearchGraphPatterns逐步地在kg中找到对应的谓词，直到找到所有的谓词
最后，我们需要将写出答案sparql，并使用ExecuteSPARQL返回答案。

基于图模式的kbqa方法，能够处理基于entity方法的不能处理的复杂问题，例如 类型约束问题，这类问题不含有topic entity (e.g. Who are the people whoes height is taller than 200cm?) 然而，我们可以通过SearchGraphPatterns的谓词，然后使用sparql的filter语句，过滤掉不符合条件的结果。
此外，得益于sparql的表达能力，我们能够轻松处理count ask 数值constraint等复杂问题。
更多复杂问题的总结，可见附录（kqapro非常复杂，IR-base方法很多都做不了，可以做个总结）


% 3.4
\subsection{人机协同的数据标注}

本文提出的方法能够非常方便的支持人机协同标注。
motivation 

1. 当有很多类型的复杂问题时，我们难以将所有类型的问题都作为demos放到上下文中，这么做一是成本过高，而是有研究表明，上下文窗口过长会导致模型性能下降。
2. 有研究表明，过程监督能够提升模型的泛化能力，而且能够帮助人们理解模型的推理过程，因此，我们提出了一种人机协同的数据标注方法，能够帮助人们标注复杂问题的推理过程，同时，也能够帮助模型学习到更多的推理能力。
3. 为开源社区贡献一份高质量的数据集，能够帮助社区更好的研究kbqa问题。

得益于本文提出的交互式的kbqa方法，我们可以很方便的标注推理过程，具体而言，只需要在每一轮LLM生成Thought和antion后设置断点，要求人类决定是否接受，如果接受，则继续执行，否则，人类可以修改LLM生成的Thought和action，然后继续执行。

% 3.5
\subsection{开源模型微调}

我们基于标注的交互式数据，对开源模型进行了微调。我们在流行的开源模型上，使用对话的形式进行微调。
